package cn.wen.java.security;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import cn.wen.java.nio.Encoder;
import cn.wen.java.utils.Assert;

/**
 * Title：安全相关操作类
 * <p>
 * Description：提供加密处理……
 * <p>
 * Copyright：Copyright (c) 2010-2012
 * 
 * @author <a href="mailto:ct_wen@qq.com">ctwen</a>, 温承瑭
 * @version Revision：1.0 Date：2010/7/22 Description：初完成。
 *          <p>
 */
public class HelperOfEncrypt {

    public static final String MD2 = "MD2";
    public static final String MD4 = "MD4";
    public static final String MD5 = "MD5";
    public static final String SHA1 = "SHA-1";
    public static final String SHA256 = "SHA-256";
    public static final String SHA384 = "SHA-384";
    public static final String SHA512 = "SHA-512";

    /**
     * 将输入字符串按指定算法加密，转换成 hash 字符串，返回的结果是16进制的数字。 
     * <p>
     * 这个方法是一个单向的加密方法。加密字符串不能还原。
     * <p>
     * 用法如：HelperOfEncrypt.digest("ctwen",HelperOfEncrypt.MD5);
     * <p>
     * 加密过后的字符串长度为32位。
     * 
     * @see MD2, MD4, MD5, SHA-1, SHA-256, SHA-384, and SHA-512 。
     * @param source 要加密的字符串。
     * @param algorithms 指定加密算法。
     * @return 一个hash字符串。
     * @throws NoSuchAlgorithmException
     */
    public static String digest(String source, String algorithms) throws NoSuchAlgorithmException {
	Assert.isNotEmpty(source, "原文不能为NULL或空字符串！");
	Assert.isNotEmpty(algorithms, "必须指定一种支持的加密算法！提供参考：MD2, MD4, MD5, SHA-1, SHA-256, SHA-384, and SHA-512 。");

	// 算法对象
	MessageDigest digestor = MessageDigest.getInstance(algorithms);

	// 转换成 hash 字符串，并返回。
	digestor.update(source.getBytes());

	return Encoder.toHexString(digestor.digest());
    }

}
